import Browser from 'webextension-polyfill'

export interface Storage {
  remove(key: string): Promise<unknown>

  get(key: string): Promise<unknown>

  set(key: string, value: unknown): Promise<void>
}

export class ExtensionStorage implements Storage {
  type: string

  constructor(type?) {
    this.type = type ? type : 'local'
  }

  get(key): Promise<unknown> {
    return new Promise((resolve, reject) => {
      Browser.storage[this.type]
        .get(key)
        .then((result) => {
          console.log('get key', key, 'result', result)
          resolve(result)
        })
        .catch((err) => {
          reject(err)
        })
    })
  }

  set(key, value): Promise<void> {
    return new Promise((resolve, reject) => {
      Browser.storage[this.type]
        .set({ [key]: value })
        .then((result) => {
          console.log('set key', key, 'value', value, 'result', result)
          resolve(value)
        })
        .catch((err) => {
          reject(err)
        })
    })
  }

  remove(key): Promise<unknown> {
    return new Promise((resolve, reject) => {
      Browser.storage[this.type]
        .remove(key)
        .then((result) => {
          console.log('remove key', key, 'result', result)
          resolve(result)
        })
        .catch((err) => {
          reject(err)
        })
    })
  }
}

export const localExtensionStorage = new ExtensionStorage()

// const extensionStorage: Storage = (() => {
//   const get = key => {
//
//   }
//
//   const set = (key, value) => {
//
//   }
//
//   const remove = key => {
//     return new Promise((resolve, reject) => {
//       Browser.storage.local.remove(key).then(result => {
//         resolve(result)
//       }).catch(err => {
//         reject(err)
//       })
//     })
//   }
//
//   const getDefaultConfig = () => ({
//     smsLock: false,
//     updateLpmbsUrlEnable: true,
//     lpmbsMockEnable: true,
//   })
//
//   const getSiteConfig = async (key) => {
//     if (!key) return {}
//     const siteConfig = (await get(key))
//     if (siteConfig) {
//       return siteConfig
//     }
//     return getDefaultConfig()[key]
//   }
//
//   const setSiteConfig = async (key, value) => {
//     if (!key) {
//       throw new Error('key is required')
//     } else {
//       await set(key, value)
//     }
//   }
//
//   return { getSiteConfig, setSiteConfig, remove }
// })()
